package edu.ensabap.matricula.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import edu.ensabap.matricula.bean.EdgarDTO;
import edu.ensabap.matricula.bean.HenryDTO;
import edu.ensabap.matricula.constants.MySQlQuery;
import edu.ensabap.matricula.constants.RowMapperConstants;

@Repository
public class HenryDAO {

	private SimpleJdbcTemplate simpleJdbcTemplate;
	private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	
	@Autowired
	public void init(DataSource dataSource){
		this.simpleJdbcTemplate=new SimpleJdbcTemplate(dataSource);
		this.jdbcTemplate=new JdbcTemplate(dataSource);
	this.namedParameterJdbcTemplate=new NamedParameterJdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public List<HenryDTO> listar(HenryDTO henry,int paginaMostrar,int cantidadFilas){
		
		String sql=" SELECT id,codigo,nombre FROM Henry where 1=1 ";
		StringBuffer sqlb=new StringBuffer();
		if(henry.getId()!=0){
			sqlb.append("and id ="+henry.getId()+" ");
		}
		if(henry.getNombre()!=null){
			sqlb.append("and nombre like  '%"+henry.getNombre()+"%' ");
		}
		if(henry.getCodigo()!=null){
			sqlb.append("and codigo like  '%"+henry.getCodigo()+"%' ");
			
		}
		sqlb.append(" ORDER BY id");
		
		sql+=sqlb.toString();
		
		int inicio=(paginaMostrar-1)*cantidadFilas;
		
		sql+= " LIMIT "+cantidadFilas+" OFFSET "+inicio;
		
		System.out.println("EL SQL ES :"+sql);
		
		return this.jdbcTemplate.query(sql, new RowMapperConstants.HenryMapper());
	}
	
	public int insertar(HenryDTO henry){
		
		String  sql = MySQlQuery.INSERTAR_HENRY;
		Map<String, Object> parametros= new HashMap<String, Object>();
		parametros.put("codigo",henry.getCodigo());
		parametros.put("nombre",henry.getNombre());

		return this.simpleJdbcTemplate.update(sql, parametros);
		
	}
	public int eliminar(HenryDTO henry){
		System.out.println("EL ID ES :"+henry.getId());
		String sql = MySQlQuery.ELIMINAR_HENRY;
		Map<String, Object> parametros= new HashMap<String, Object>();
		parametros.put("id",henry.getId());
		
		return this.simpleJdbcTemplate.update(sql, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<HenryDTO> obtenerXID(HenryDTO henry){
		System.out.println("entro al dao obtener por parametro");
		String sql = MySQlQuery.OBTENER_POR_ID_HENRY;
		if(henry.getId()!=0){
			sql+= " and id= "+ henry.getId()+" ";
		}		
		return this.jdbcTemplate.query(sql, new RowMapperConstants.HenryMapper());	
	}
	public int modificar(HenryDTO henry){
		
		System.out.println("el nombre DAO  :"+henry.getId());
		System.out.println("el nombre DAO  :"+henry.getNombre());
		System.out.println("el nombre DAO  :"+henry.getCodigo());
		
		
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo",henry.getCodigo());
		parametros.put("nombre",henry.getNombre());
		parametros.put("id",henry.getId());
		String sql = MySQlQuery.MODIFICAR_HENRY;
		
		return this.simpleJdbcTemplate.update(sql,parametros);
	}
public int numeroPaginas(HenryDTO henry,int cantidadFilas){
		
		StringBuffer sqlb= new StringBuffer();
		if(henry.getCodigo()!=null){
			sqlb.append(" and codigo LIKE '%"+henry.getCodigo()+"%' ");
		}
		if(henry.getNombre()!=null){
			sqlb.append(" and nombre LIKE '%"+henry.getNombre()+"%' ");
		}
//		obtener la cantidad de registros
		StringBuffer sqlbcantidadRegistros=new StringBuffer(MySQlQuery.CANTIDAD_DE_REGISTROS_HENRY);
		sqlbcantidadRegistros.append(sqlb.toString());
		String cantidadRegistros=sqlbcantidadRegistros.toString();
		
//		obtengo la cantidad de registros
		int cantidad=this.simpleJdbcTemplate.queryForInt(cantidadRegistros);
		
		int numeroDePaginas;
		
		//primero el cociente
		numeroDePaginas = cantidad/cantidadFilas;
		//ahora el residuo
		if(cantidad%cantidadFilas>0)numeroDePaginas++;
		
		return numeroDePaginas;
	}






}